package cn.iocoder.yudao.module.system.service.examtest;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.examtest.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.examtest.ExamTestDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 考试信息 Service 接口
 *
 * @author 芋道源码
 */
public interface ExamTestService {

    /**
     * 创建考试信息
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createExamTest(@Valid ExamTestCreateReqVO createReqVO);

    /**
     * 更新考试信息
     *
     * @param updateReqVO 更新信息
     */
    void updateExamTest(@Valid ExamTestUpdateReqVO updateReqVO);

    /**
     * 删除考试信息
     *
     * @param id 编号
     */
    void deleteExamTest(Long id);

    /**
     * 获得考试信息
     *
     * @param id 编号
     * @return 考试信息
     */
    ExamTestDO getExamTest(Long id);

    /**
     * 获得考试信息列表
     *
     * @param ids 编号
     * @return 考试信息列表
     */
    List<ExamTestDO> getExamTestList(Collection<Long> ids);

    /**
     * 获得考试信息分页
     *
     * @param pageReqVO 分页查询
     * @return 考试信息分页
     */
    PageResult<ExamTestDO> getExamTestPage(ExamTestPageReqVO pageReqVO);

    /**
     * 获得考试信息列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 考试信息列表
     */
    List<ExamTestDO> getExamTestList(ExamTestPageReqVO exportReqVO);

    /**
     * 根据班级ID获取考试列表
     *
     * @param classId 班级ID
     * @return 考试列表
     */
    List<ExamTestDO> getExamTestListByClassId(Long classId);



    /**
     * 根据状态获取考试列表
     *
     * @param status 状态
     * @return 考试列表
     */
    List<ExamTestDO> getExamTestListByStatus(Integer status);

    /**
     * 更新考试状态
     *
     * @param id 考试ID
     * @param status 新状态
     */
    void updateExamTestStatus(Long id, Integer status);

    /**
     * 开始考试
     *
     * @param id 考试ID
     */
    void startExamTest(Long id);

    /**
     * 结束考试
     *
     * @param id 考试ID
     */
    void endExamTest(Long id);

    /**
     * 获取考试信息树形结构（包含班级信息）
     *
     * @param id 考试ID
     * @return 考试信息树形结构
     */
    ExamTestTreeRespVO getExamTestTree(Long id);

    /**
     * 获取考试信息树形结构列表（包含班级信息）
     *
     * @param pageReqVO 查询条件
     * @return 考试信息树形结构列表
     */
    List<ExamTestTreeRespVO> getExamTestTreeList(ExamTestPageReqVO pageReqVO);

}